package controle;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import modelo.Aluno;
import modelo.AlunoTurma;
import modelo.Turma;
import service.AlunoService;
import service.AlunoTurmaService;
import service.TurmaService;
import util.FabricaDeObjetos;

/**
 *
 * @author Jorge
 */
public class AlunoTurmaMB extends BaseMB {

    private AlunoTurmaService alunoTurmaService;
    private AlunoService alunoService;
    private List<AlunoTurma> listaAlunoTurma;
    private AlunoTurma alunoTurmaCorrente;
    private ListDataModel listaDataModel;
    private Aluno alunoCorrente;
    private Turma turmaCorrente;
    private List<String> turmasSelecionadas;
    private List<SelectItem> turmasDisponiveis;
    private List<String> alunosSelecionados;

    public List<SelectItem> getAlunosDisponiveis() {
        return alunosDisponiveis;
    }

    public void setAlunosDisponiveis(List<SelectItem> alunosDisponiveis) {
        this.alunosDisponiveis = alunosDisponiveis;
    }
    private List<SelectItem> alunosDisponiveis;
    private TurmaService turmaService;

    public AlunoTurmaMB() {
        try {
            alunoTurmaService = (AlunoTurmaService) FabricaDeObjetos.getObjetoUnico(AlunoTurmaService.class);
            alunoService = (AlunoService) FabricaDeObjetos.getObjetoUnico(AlunoService.class);
            turmaService = (TurmaService) FabricaDeObjetos.getObjetoUnico(TurmaService.class);
        } catch (Exception ex) {
            Logger.getLogger(AlunoTurmaMB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String addAlunos() {
        TurmaMB turmaMB = (TurmaMB) getAtributoDaSessao("turmaMB");

        turmaCorrente = (Turma) turmaMB.getListaDataModel().getRowData();

        List<Aluno> alunos = alunoService.getDisponiveisPorTurma(turmaCorrente);

        alunosDisponiveis = new ArrayList<SelectItem>();
        for (Aluno aluno : alunos) {
            alunosDisponiveis.add(new SelectItem(aluno, aluno.getNome()));
        }

        alunosSelecionados = null;
        
        return "addAlunos";
    }

    //Método auxiliar
    private String inscreverEmTurma(String origem) {
        AlunoMB alunoMB = (AlunoMB) getAtributoDaSessao("alunoMB");

        if (origem.equals("exibirTodos")) {
            alunoCorrente = (Aluno) alunoMB.getListaDataModel().getRowData();
        } else {
            alunoCorrente = alunoMB.getAlunoCorrente();
        }
        // O método getDisponiveisPorAluno deve recuperar as matérias em que o aluno ainda não se inscreveu
        // O Aluno alunoCorrente pode ser carregado em uma página anterior, ex., manda mostrar uma lista de alunos e
        // seleciona-se um aluno da lista (carregando-o em alunoCorrente) para realizar uma inscrição
        List<Turma> turmas = turmaService.getDisponiveisPorAluno(alunoCorrente);

        // Adicionamos na lista de SelectItem. O SelectItem é usado para criar a combo box
        turmasDisponiveis = new ArrayList<SelectItem>();
        for (Turma turma : turmas) {
            turmasDisponiveis.add(new SelectItem(turma, turma.getDisciplina().getNome()));
        }

        // "Zeramos" a lista de turmasSelecionadas
        turmasSelecionadas = null;

        return "inscreverAluno";
    }

    // Método que mostra a página com as turmas disponíveis para o aluno
    public String inscreverEmTurmaPelaExibirTodos() {
        return inscreverEmTurma("exibirTodos");
    }

    public String inscreverEmTurmaPelaBusca() {
        return inscreverEmTurma("busca");
    }

    public String salvarInscricao() {

        for (String nomeTurma : turmasSelecionadas) {

            List<Turma> listaTurma = turmaService.getTodas();

            Turma turmaEscolhida = null;

            for (Turma turma : listaTurma) {
                if (turma.getDisciplina().getNome().equals(nomeTurma)) {
                    turmaEscolhida = turma;
                    break;
                }
            }

            AlunoTurma alunoTurma = new AlunoTurma();
            alunoTurma.setAluno(alunoCorrente);
            alunoTurma.setTurma(turmaEscolhida);
            alunoTurmaService.inserir(alunoTurma);
        }

        return "inscricaoSalva";
    }
    
    public String salvarInscricaoAlunos() {
        for (String nomeAluno : alunosSelecionados) {
            List<Aluno> listaAlunos = alunoService.getTodos();

            Aluno alunoEscolhido = null;

            for (Aluno aluno : listaAlunos) {
                if (aluno.getNome().equals(nomeAluno)) {
                    alunoEscolhido = aluno;
                    break;
                }
            }

            AlunoTurma alunoTurma = new AlunoTurma();
            alunoTurma.setAluno(alunoEscolhido);
            alunoTurma.setTurma(turmaCorrente);
            alunoTurmaService.inserir(alunoTurma);
        }
        
        return "inscricaoSalvaAlunos";
    }

    //Método auxiliar
    private String excluir(AlunoTurma alunoTurma) {
        alunoTurmaService.remover(alunoTurma);

        return "alunoTurmaExcluido";
    }

    public String excluirPorAluno() {
        AlunoMB alunoMB = (AlunoMB) getAtributoDaSessao("alunoMB");

        AlunoTurma alunoTurma = (AlunoTurma) alunoMB.getListaDataModel().getRowData();

        return excluir(alunoTurma);
    }

    public String voltar() {
        alunoTurmaCorrente = new AlunoTurma();

        return "VoltarExibirTodos";
    }

    public ListDataModel getListaDataModel() {
        return listaDataModel;
    }

    public void setListaDataModel(ListDataModel listaDataModel) {
        this.listaDataModel = listaDataModel;
    }

    public Aluno getAlunoCorrente() {
        return alunoCorrente;
    }

    public void setAlunoCorrente(Aluno alunoCorrente) {
        this.alunoCorrente = alunoCorrente;
    }

    public List<AlunoTurma> getListaAlunoTurma() {
        return listaAlunoTurma;
    }

    public void setListaAlunoTurma(List<AlunoTurma> listaAlunoTurma) {
        this.listaAlunoTurma = listaAlunoTurma;
    }

    public AlunoTurma getAlunoTurmaCorrente() {
        return alunoTurmaCorrente;
    }

    public void setAlunoTurmaCorrente(AlunoTurma alunoTurmaCorrente) {
        this.alunoTurmaCorrente = alunoTurmaCorrente;
    }

    public List<String> getTurmasSelecionadas() {
        return turmasSelecionadas;
    }

    public void setTurmasSelecionadas(List<String> turmasSelecionadas) {
        this.turmasSelecionadas = turmasSelecionadas;
    }

    public List<SelectItem> getTurmasDisponiveis() {
        return turmasDisponiveis;
    }

    public void setTurmasDisponiveis(List<SelectItem> turmasDisponiveis) {
        this.turmasDisponiveis = turmasDisponiveis;
    }
    
    public List<String> getAlunosSelecionados() {
        return alunosSelecionados;
    }

    public void setAlunosSelecionados(List<String> alunosSelecionados) {
        this.alunosSelecionados = alunosSelecionados;
    }
    
    public Turma getTurmaCorrente() {
        return turmaCorrente;
    }

    public void setTurmaCorrente(Turma turmaCorrente) {
        this.turmaCorrente = turmaCorrente;
    }
}
